//------------------------------------------------------------------------------
//	ʒ[Ŕ˂e𔭎˂
//	x傫Aˈʒǔ덷傫Ȃ
//	@X		exW
//	@Y		eyW
//	@Speed		x
//	@Angle		px
//	@Graph		摜
//	@Delay		xt[
//	@RefFlag	EEEEŔ˂邩(zœB1Ŕ)
//	@RefNumber	ˉ
//------------------------------------------------------------------------------
task ReflectShot(X,Y,Speed,Angle,Graph,Delay,RefFlag,RefNumber){
	let refnum = RefNumber;
	let obj = Obj_Create(OBJ_SHOT);
	Obj_SetPosition(obj,X,Y);
	Obj_SetSpeed(obj,Speed);
	Obj_SetAngle(obj,Angle);
	ObjShot_SetGraphic(obj,Graph);
	ObjShot_SetDelay(obj,Delay);
	
	while(Obj_BeDeleted(obj) == false) {
		if(Obj_GetX(obj) <= GetClipMinX() && RefFlag[0] == 1  && refnum >= 1){
			Obj_SetAngle(obj, 180 - Obj_GetAngle(obj));
			refnum -= 1;
		}
		if(Obj_GetY(obj) <= GetClipMinY() && RefFlag[1] == 1  && refnum >= 1){
			Obj_SetAngle(obj, -Obj_GetAngle(obj));
			refnum -= 1;
		}
		if(Obj_GetX(obj) >= GetClipMaxX() && RefFlag[2] == 1  && refnum >= 1){
			Obj_SetAngle(obj, 180 - Obj_GetAngle(obj));
			refnum -= 1;
		}
		if(Obj_GetY(obj) >= GetClipMaxY() && RefFlag[3] == 1  && refnum >= 1){
			Obj_SetAngle(obj, -Obj_GetAngle(obj));
			refnum -= 1;
		}
		yield;
	}
}

//------------------------------------------------------------------------------
//	ʒ[Ŕ˂e𔭎˂(1݂̂̌yʉŁArŕʂ̒eɕς)
//	x傫Aˈʒǔ덷傫Ȃ
//	@X		exW
//	@Y		eyW
//	@Speed		x
//	@Angle		px
//	@Graph		摜
//	@Delay		xt[
//	@RefFlag	EEEEŔ˂邩(zœB1Ŕ)
//------------------------------------------------------------------------------
task ReflectShot2(X,Y,Speed,Angle,Graph,Delay,RefFlag){
	let obj = Obj_Create(OBJ_SHOT);
	Obj_SetPosition(obj,X,Y);
	Obj_SetSpeed(obj,Speed);
	Obj_SetAngle(obj,Angle);
	ObjShot_SetGraphic(obj,Graph);
	ObjShot_SetDelay(obj,Delay);
	
	while( !Obj_BeDeleted(obj) ){
		if(Obj_GetX(obj) <= GetClipMinX() && RefFlag[0] == 1){
			CreateShot01( Obj_GetX(obj),Obj_GetY(obj),Speed,180 - Obj_GetAngle(obj),Graph,0 );
			Obj_Delete(obj);
		}
		if(Obj_GetY(obj) <= GetClipMinY() && RefFlag[1] == 1){
			CreateShot01( Obj_GetX(obj),Obj_GetY(obj),Speed,-Obj_GetAngle(obj),Graph,0 );
			Obj_Delete(obj);
		}
		if(Obj_GetX(obj) >= GetClipMaxX() && RefFlag[2] == 1){
			CreateShot01( Obj_GetX(obj),Obj_GetY(obj),Speed,180 - Obj_GetAngle(obj),Graph,0 );
			Obj_Delete(obj);
		}
		if(Obj_GetY(obj) >= GetClipMaxY() && RefFlag[3] == 1){
			CreateShot01( Obj_GetX(obj),Obj_GetY(obj),Speed,-Obj_GetAngle(obj),Graph,0 );
			Obj_Delete(obj);
		}
		yield;
	}
}

//------------------------------------------------------------------------------
//	d͂ŉe𔭎˂
//	pxAd͊px͐Ίpxw(SetShotDirectionTypȅԂɂ͊֌WȂ)
//	@X		exW
//	@Y		eyW
//	@Speed		x
//	@Angle		px
//	@Graph		摜
//	@Delay		xt[
//	@GrvSpeed	d͉x
//	@GrvAngle	d͊px
//	@MaxSpeed	ő呬x
//------------------------------------------------------------------------------
function GravityShot(X,Y,Speed,Angle,Graph,Delay,GrvSpeed,GrvAngle,MaxSpeed){
	let xSpeed = Speed * cos(Angle);
	let ySpeed = Speed * sin(Angle);
	let accXSpeed = GrvSpeed * cos(GrvAngle);
	let accYSpeed = GrvSpeed * sin(GrvAngle);
	let maxXSpeed = [MaxSpeed,-MaxSpeed][accXSpeed < 0];
	let maxYSpeed = [MaxSpeed,-MaxSpeed][accYSpeed < 0];
	
	CreateShot12(X,Y,xSpeed,ySpeed,accXSpeed,accYSpeed,maxXSpeed,maxYSpeed,Graph,Delay);
}

//------------------------------------------------------------------------------
//	d͂ŉe𔭎˂֐Obj
//	pxAd͊px͐Ίpxw(SetShotDirectionTypȅԂɂ͊֌WȂ)
//	@X		exW
//	@Y		eyW
//	@Speed		x
//	@Angle		px
//	@Graph		摜
//	@Delay		xt[
//	@GrvSpeed	d͉x
//	@GrvAngle	d͊px
//	@MaxSpeed	ő呬x
//------------------------------------------------------------------------------
function GravityShotObj(x,y,speed,angle,graph,delay,gspeed,gangle,maxspeed){
	let obj = Obj_Create(OBJ_SHOT);
	Obj_SetPosition(obj,x,y);
	Obj_SetSpeed(obj,0);
	Obj_SetAngle(obj,angle);
	ObjShot_SetGraphic(obj,graph);
	ObjShot_SetDelay(obj,delay);
	
	ObjShot_SetGravity(obj,x,y,speed,angle,graph,delay,gspeed,gangle,maxspeed);
	
	return obj;
}

task ObjShot_SetGravity(obj,x,y,speed,angle,graph,delay,gspeed,gangle,maxspeed){
	let vx = speed * cos(angle);
	let vy = speed * sin(angle);
	
	if(delay > 0){
		loop(delay){
			yield;
		}
	}
	
	while( !Obj_BeDeleted(obj) ){
		vx += gspeed * cos(gangle);
		vy += gspeed * sin(gangle);
		Obj_SetPosition(obj, Obj_GetX(obj) + vx, Obj_GetY(obj) + vy);
		Obj_SetAngle(obj, atan2(vy,vx) );
		
		yield;
	}
}

//------------------------------------------------------------------------------
//	ʒ[Ŕ˂郌[U[𔭎˂
//	x傫Aˈʒǔ덷傫Ȃ
//	@X		exW
//	@Y		eyW
//	@Speed		x
//	@Angle		px
//	@Lng		[U[̒
//	@Wid		[U[̕
//	@Graph		摜
//	@Delay		xt[
//	@RefFlag	EEEEŔ˂邩(zœB1Ŕ)
//	@RefNumber	ˉ
//------------------------------------------------------------------------------
task RefrectLaser(X,Y,Speed,Angle,Lng,Wid,Graph,Delay,RefFlag,RefNumber){
	let refnum = RefNumber;
	
	let vLng = 0;
	
	let mx = Speed * cos(Angle);
	let my = Speed * sin(Angle);
	
	let vx = X;
	let vy = Y;
	
	let obj = Obj_Create(OBJ_LASER);
	Obj_SetPosition(obj,X,Y);
	Obj_SetSpeed(obj,Speed);
	Obj_SetAngle(obj,Angle);
	ObjShot_SetGraphic(obj,Graph);
	ObjShot_SetDelay(obj,Delay);
	
	ObjLaser_SetLength(obj,0);
	ObjLaser_SetWidth(obj,Wid);
	ObjLaser_SetSource(obj,false);
	
	while( !Obj_BeDeleted(obj) ){
		if( vLng < Lng ){
			vLng += Speed;
			ObjLaser_SetLength(obj,vLng);
		}else{
			vx += mx;
			vy += my;
		}
		
		Obj_SetPosition(obj,vx,vy);
		
		if(ObjLaser_GetEndX(obj) <= GetClipMinX() && RefFlag[0] == 1  && refnum >= 1){
			RefrectLaser(ObjLaser_GetEndX(obj),ObjLaser_GetEndY(obj),Speed,180 - Angle,Lng,Wid,Graph,0,RefFlag,RefNumber - 1);
			refnum = 0;
		}
		if(ObjLaser_GetEndY(obj) <= GetClipMinY() && RefFlag[1] == 1  && refnum >= 1){
			RefrectLaser(ObjLaser_GetEndX(obj),ObjLaser_GetEndY(obj),Speed,-Angle,Lng,Wid,Graph,0,RefFlag,RefNumber - 1);
			refnum = 0;
		}
		if(ObjLaser_GetEndX(obj) >= GetClipMaxX() && RefFlag[2] == 1  && refnum >= 1){
			RefrectLaser(ObjLaser_GetEndX(obj),ObjLaser_GetEndY(obj),Speed,180 - Angle,Lng,Wid,Graph,0,RefFlag,RefNumber - 1);
			refnum = 0;
		}
		if(ObjLaser_GetEndY(obj) >= GetClipMaxY() && RefFlag[3] == 1  && refnum >= 1){
			RefrectLaser(ObjLaser_GetEndX(obj),ObjLaser_GetEndY(obj),Speed,-Angle,Lng,Wid,Graph,0,RefFlag,RefNumber - 1);
			refnum = 0;
		}
		
		yield;
	}
}